import type { Status } from '@/utils/types';

import { CwindUser } from '@/models/cwind_user.model'; // cwind_user 实体
// 数据库实体
// cwind_menus 实体
/*
 * @Description: CwindMenu Entity
 * @Version: 2.0
 * @Author: cwind
 * @Date: 2022-10-27 10:13:54
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2025-05-13 18:19:26
 */
import {
  Column,
  DataType,
  ForeignKey,
  IsIn,
  IsUUID,
  Model,
  PrimaryKey,
  Table,
} from 'sequelize-typescript';

@Table({ tableName: 'cwind_menus', underscored: false })
export class CwindMenus extends Model<any, any> {
  // "active_icon",
  // 激活菜单图标
  @Column({ type: DataType.STRING(50), comment: '激活菜单图标' })
  active_icon?: string;
  // "active_path",
  // 激活路径
  @Column({ type: DataType.STRING(100), comment: '激活路径' })
  active_path?: string;
  // "affix_tab 固定在标签",
  @IsIn({
    args: [[0, 1]],
    msg: 'affix_tab 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 0,
    comment: '固定在标签（0:不固定，1：固定）',
  })
  affix_tab: Status;
  // "badge",
  // 徽标内容
  @Column({ type: DataType.STRING(10), comment: '徽标内容' })
  badge?: string;
  // "badge_type",
  // 徽标类型
  @Column({ type: DataType.STRING(10), comment: '徽标类型' })
  badge_type?: string;
  // "badge_variants",
  // 徽标样式
  @Column({ type: DataType.STRING(10), comment: '徽标样式' })
  badge_variants?: string;
  // "component",
  // 菜单对应的文件路径
  @Column({ type: DataType.STRING(200), comment: '菜单对应的文件路径' })
  component?: string;
  // 创建人
  @IsUUID(4)
  @ForeignKey(() => CwindUser)
  @Column({
    type: DataType.UUID,
    allowNull: false,
    comment: '创建人',
    defaultValue: 'cwind',
  })
  creator: string;
  // "hide_children_in_menu 隐藏子菜单",
  @IsIn({
    args: [[0, 1]],
    msg: 'hide_children_in_menu 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 0,
    comment: '隐藏子菜单:不隐藏，1：隐藏）',
  })
  hide_children_in_menu: Status;
  // "hide_in_breadcrumb 隐藏面包屑",
  @IsIn({
    args: [[0, 1]],
    msg: 'hide_in_breadcrumb 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 0,
    comment: '隐藏面包屑:不隐藏，1：隐藏）',
  })
  hide_in_breadcrumb: Status;
  // "hide_in_menu 隐藏菜单",
  @IsIn({
    args: [[0, 1]],
    msg: 'hide_in_menu 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 0,
    comment: '隐藏菜单（0:不隐藏，1：隐藏）',
  })
  hide_in_menu: Status;
  // "hide_in_tab 隐藏标签页",
  @IsIn({
    args: [[0, 1]],
    msg: 'hide_in_tab 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 0,
    comment: '隐藏标签页:不隐藏，1：隐藏）',
  })
  hide_in_tab: Status;
  // "icon",
  // 菜单图标
  @Column({ type: DataType.STRING(50), comment: '菜单图标' })
  icon?: string;
  // "link",
  @Column({ type: DataType.STRING(100), comment: '外链地址' })
  iframe_src?: string;
  // "keep_alive",
  @IsIn({
    args: [[0, 1]],
    msg: 'keep_alive 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 0,
    comment: '页面缓存（0:不缓存，1：缓存）',
  })
  keep_alive: Status;
  // "link",
  @Column({ type: DataType.STRING(100), comment: '链接地址' })
  link?: string;
  // "menu_id",
  @IsUUID(4)
  @PrimaryKey
  @Column({
    type: DataType.UUID,
    defaultValue: DataType.UUIDV4,
    comment: '菜单id',
  })
  menu_id: string;
  // "name",
  // 国际化对应的name
  @Column({
    type: DataType.STRING(20),
    comment: '路由地址',
  })
  name: string;
  // 排序
  @Column({
    type: DataType.INTEGER,
    comment: '排序',
    defaultValue: 999,
  })
  order: number;
  // "path",
  // 路由url
  @Column({ type: DataType.STRING(100), comment: '路由url' })
  path?: string;
  // "auth_code",
  // 菜单标识(页面按钮权限控制)
  @Column({ type: DataType.STRING(100), comment: '菜单标识(页面按钮权限控制)' })
  permission?: string;
  // "pid",
  @IsUUID(4)
  @Column({ type: DataType.UUID, comment: '父级id' })
  pid?: string;
  // "status",
  // 菜单状态
  @IsIn({
    args: [[0, 1]],
    msg: 'status 字段值错误',
  })
  @Column({
    type: DataType.INTEGER,
    defaultValue: 1,
    comment: '菜单状态（0:禁用，1：正常）',
  })
  status: Status;
  // "title",
  @Column({
    type: DataType.STRING(100),
    comment: '标题',
  })
  title: string;
  // "type",
  // 菜单类型
  @Column({
    type: DataType.STRING(20),
    comment: '菜单类型',
  })
  type: string;
}
